/*
 * @FilePath     : /clock/components/display/lcd.c
 * @Author       : Ma Xiaowei
 * @Date         : 2020-08-12 14:11
 * @LastEditTime : 2020-08-12 16:16
 * @LastEditors  : Ma Xiaowei
 * @Description  : 显示模块，作为接口提供给其他组件
 */
#include <time.h>
#include <sys/time.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_log.h"
#include "lcd.h"

#include "ST7735S.h"

const static char *TAG = "LCD";
static EventGroupHandle_t disp_event_group;

static void display_time_test(void)
{
    time_t now;
    struct tm ti;
    char buf[6];

    // 获取当前时间
    time(&now);
    localtime_r(&now, &ti);
    // 格式化 hh:mm
    strftime(buf, sizeof(buf), "%R", &ti);
    ESP_LOGI(TAG, "%s",buf);
    // TODO:显示时间
}

/**
 * @brief 显示任务，等待各个标志位来显示不同的信息
 */
static void display_task(void *pv)
{
    EventBits_t bits;
    while (1) {
        bits = xEventGroupWaitBits(disp_event_group,
                DISP_UPDATE_TIME_BIT,
                pdTRUE, pdFALSE, portMAX_DELAY);

        if (bits & DISP_UPDATE_TIME_BIT) {
            display_time_test(); /* TODO: 仅用于测试，不能指定显示位置 */
        }
    }

    vEventGroupDelete(disp_event_group);
    vTaskDelete(NULL);
}

void display_init(void)
{
    st_init();

    disp_event_group = xEventGroupCreate();
    xTaskCreate(display_task, "DISP_TASK", 2048, NULL, 6, NULL);
}

EventGroupHandle_t get_disp_handle(void)
{
    return disp_event_group;
}